package design.donkey.auto.ddl.dialect;

import java.sql.Connection;
import java.util.List;
import java.util.Map;
import java.util.Set;

import design.donkey.auto.ddl.model.TableMetaModel;

/**
 * 数据库方言
 *
 * @author zhangjiakung
 * @since 0.0.1
 */
public interface Dialect {

    /**
     * 获取 数据库名称
     *
     * @return 数据库名称
     */
    String getProductName();

    /**
     * 获取 数据库主版本号
     *
     * @return 数据库主版本号
     */
    String getProductVersion();

    /**
     * 生成创建表格
     * 
     * @param tableMetaModel 表格元数据
     * @return create ddl
     */
    default List<String> create(TableMetaModel tableMetaModel) {
        return create(tableMetaModel, false);
    }

    /**
     * 生成创建表格
     * 
     * @param tableMetaModel 表格元数据
     * @param format 是否格式化
     * @return create ddl
     */
    List<String> create(TableMetaModel tableMetaModel, boolean format);

    /**
     * 对比两个 SQL schemas 脚本生成从 sourceSchemaSql 变化到 targetSchemaSql 需要执行 SchemaSQL 脚本。
     *
     * @param sourceSchemaSql 源 Schema SQL 脚本
     * @param targetSchemaSql 目标 Schema SQL 脚本
     * @param operations 生成的 维护 Schema SQL 脚本 允许出现的 ddl 类型
     * @return 需要执行的 SQL 脚本列表
     */
    Map<String, List<String>> maintenance(String sourceSchemaSql, String targetSchemaSql, Set<DdlOperation> operations);

    /**
     * 通过连接 获取建表语句
     * 
     * @param connection connection
     * @param tableMetaModel tableMetaModel
     * @return ddl
     */
    String getCreateDdlByConnection(Connection connection, TableMetaModel tableMetaModel);
}
